/**
 * 
 */
package com.feib.stms.service;

import java.util.Date;
import java.util.List;

import org.springframework.transaction.annotation.Transactional;


import com.feib.stms.model.UploadFile;

import com.feib.stms.pagination.PaginatedList;

/**
 * @author Jimmy Liu
 *
 */
@Transactional(readOnly = true)
public interface UploadFileService 
{

	/**
	 * 查詢上傳檔案紀錄
	 * @param uploadFile 查詢條件
	 * @param uploaddDateFrom 上傳日期起
	 * @param uploadDateTo 上傳日期迄
	 * @param deliveryDateFrom 交割日期起
	 * @param deliveryDateTo 交割日期迄
	 * @param fileFormats 上傳檔案格式(多種)
	 * @param paginatedList 排序與換頁條件
	 * @return 查詢結果
	 */
	public PaginatedList<UploadFile> findPaginatedListByUploadFile(UploadFile uploadFile, Date uploaddDateFrom, Date uploadDateTo, Date deliveryDateFrom, Date deliveryDateTo, List<String> fileFormats, PaginatedList paginatedList);

	
	/**
	 * 
	 * @param uploadFilePk
	 * @return
	 */
	public UploadFile findUploadFileByPk(Long uploadFilePk);
	
	

	/**
	 * 查詢待處理檔案(待審查待放行取消)
	 * <li>業務規則說明:
	 * <ol>
	 * <li>1.資料必須通過多人審查,放行(券商自定門檻人數)，才算審查完畢</li>
	 * <li>2.同一份資料，同一主管不能執行審查作業又執行放行作業。
	 * <br/> 也就是審查主管與放行主管不可為同一人；且此主管最多只能審查一次or放行一次此交割款資料。</li>
	 * </ol></li>
	 * @param uploadFile 查詢條件
	 * @param uploaddDateFrom 上傳日期起
	 * @param uploadDateTo 上傳日期迄
	 * @param fileFormats 上傳檔案格式(多種)
	 * @param paginatedList 排序與換頁條件
	 * @return 查詢結果
	 */
	public PaginatedList<UploadFile> findPaginatedListDealUploadFile(UploadFile uploadFile, Date uploaddDateFrom, Date uploadDateTo, List<String> fileFormats, List<Integer> fileStatus, PaginatedList paginatedList);


	
	 /**
     * 更新檔案狀態 不紀錄UploadFileActionLog
     * @param uploadFilePk 上傳檔案pk key
     * @param fileStatus 
	 * 檔案狀態<br/>
	 * <ul>				
	 * <li>  0: 已上傳/待驗資/待審查(已轉入，尚未有任何人審查)</li>
	 * <li>  1. 第一次驗資中(驗資檔)</li>
	 * <li>  3. 第一次驗資完成(驗資檔)</li>
	 * <li>  5. 第二次驗資中(驗資檔)</li>
	 * <li>  7. 已驗資(驗資檔)</li>
	 * <li>  9. 轉交割(驗資檔轉交割檔，狀態歸屬在 已驗資)</li>
	 * <li> 10: 審查中(已有人員審查，但未達到審查人數門檻)</li>
	 * <li> 20: 已刪除/審查不通過(只要有一人審查不通過，即為審查不通過；明細應註記為刪除)</li>
	 * <li> 30: 已審查/待放行(檔案審查通過，所有審查人員皆對檔案審查通過)</li>
	 * <li> 40: 放行中(已有人員放行，但未達到放行人數門檻)</li>
	 * <li> 50: 已刪除/不放行(只要有一人不放行，即為放行不通過；明細應註記為刪除)</li>
	 * <li> 60: 已放行/待預約(即全數放行通過)</li>
	 * <li> 70: 已取消(即放行後反悔，要刪除；明細應註記為刪除)</li>
	 * <li> 80: 預扣中(即發送預扣電文，狀態歸屬在 已放行)</li>
	 * <li> 90: 已預扣(即收到預扣回覆檔案)</li>
	 * <li>100: 交易中(即銷帳批次執行中，狀態歸屬在 已預扣)</li> 
	 * <li>110: 已交易(即銷帳批次完成)<li>
	 * </ul>
	 */
    @Transactional(readOnly = false)
    public int updateUploadFileStatus(Long uploadFilePk, Integer fileStatus);

    
    /**
     * 查詢審查次數
     * @param uploadFilePk
     * @return UploadFile.CheckCount
     */
    public int findUploadFileCheckCount(Long uploadFilePk);
    
    /**
     * 查詢放行次數
     * @param uploadFilePk
     * @return UploadFile.ConfirmCount
     */
    public int findUploadFileConfirmCount(Long uploadFilePk);
    
    
    
    /**
     * 更新檔案狀態--審查
     * 包含UploadFileActionLog UploadFileTodoList 的新增
     * @param menuItemPk for update_todolist
     * @return  
     */
    @Transactional(readOnly = false)
    public void doCheckUploadFile(List<UploadFile> checkUploadFile,Long menuItemPk,List<String> actions);
    
    
    /**
     * 更新檔案狀態--放行 
     * 包含UploadFileActionLog  的新增
     * @param signerCert TODO
     * @return 
     */
    @Transactional(readOnly = false)
    public void doConfirmUploadFile(List<UploadFile> uploadFile,List<String> actions, String signerCert);  
    
    
    
    /**
     * 更新檔案狀態--取消
     * 包含UploadFileActionLog  的新增
     * @return 
     */
    @Transactional(readOnly = false)
    public void doCancelUploadFile(List<UploadFile> uploadFile);  
    
    
    /**
     * 更新檔案狀態--刪除
     * 包含UploadFileActionLog  的新增
     */
    @Transactional(readOnly = false)
    public int doDeleteUploadFile(Long uploadFilePk,Integer fileStatus);
	
}
